home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / umich / utils / gemfxm15.lzh / MINICOLR.LZH / MINICOLR.C < prev    next >
C/C++ Source or Header  |  1990-05-27  |  35KB  |  824 lines

  1.  
  2. /**************************************************************************
  3.  *
  4.  * mini_pallete - A little bitty control-panel-like color pallete acc.
  5.  *
  6.  *  Public Domain example program by Ian Lepore.
  7.  *
  8.  *  This is distributed as an example of how to write an accessory using
  9.  *  my AESFAST public domain GEM bindings.  This example uses a few of
  10.  *  the nifty utilities from AESFAST, but it's pretty much straightforward
  11.  *  window-handling code.
  12.  *
  13.  *  I built this beast because I have some graphics programs (Mandelbrot
  14.  *  fractal generators, a spyrograph program, etc), in which one would
  15.  *  naturally want to change the screen colors on the fly, but the %^$%#*&
  16.  *  system control panel covers the whole screen in low rez.  This acc
  17.  *  gives a nice itty-bitty moveable window with all the necessary color
  18.  *  controls in it.
  19.  *
  20.  *  This acc does not behave like the system control panel, in that it
  21.  *  will not reset the colors the application has set when you call it up.
  22.  *  On the other hand, the color changes you do with this accessory will 
  23.  *  not be saved if you use 'Save Desktop'. (Hint:  You would need to code
  24.  *  the shel_read() and shel_write() AES functions to make that work.  
  25.  *  Actually doing it is left as an excerise for the reader <grin>).
  26.  *
  27.  *  Also, the order of the colored boxes on the screen corresponds to the
  28.  *  TOS order of colors, not the VDI order.  (EG:  The foreground and
  29.  *  background colors are the first and last boxes, not the first two).
  30.  *
  31.  *  This code is pretty heavily commented.  Please excuse me if some of 
  32.  *  the comments seem obvious, but I figure the audience for this will 
  33.  *  include both beginning C programmers, and old-timers who just need to
  34.  *  see how my bindings work as opposed to other bindings.
  35.  *
  36.  *************************************************************************/
  37.  
  38. #include <gemfast.h>
  39. #include <osbind.h>
  40.  
  41. #ifndef TRUE
  42. #define TRUE  1
  43. #define FALSE 0
  44. #endif
  45.  
  46. #define Getcolor(a) ((int)(Setcolor((a), -1)))
  47.  
  48. #define graf_mkstate    graq_mstate    /* use Line-A mouse state call */
  49.  
  50. /**************************************************************************
  51.  *
  52.  * global vars (gee, there's not many of these for a change...)
  53.  *
  54.  *************************************************************************/
  55.  
  56. struct rgb_settings {
  57.         char red, grn, blu, filler;
  58.         } cur_setting;
  59.  
  60. int     coloridx = 0;                   /* default color index is # 0    */
  61.  
  62. #define WI_KIND         (MOVER|CLOSER|NAME)
  63. #define NO_WINDOW       -1
  64.  
  65. extern int gl_apid;                     /* defined in bindings library   */
  66.  
  67. int     menu_id ;                       /* our menu id                   */
  68. int     wi_handle;                      /* window handle                 */
  69. GRECT   treerect;                       /* object tree (in window) rect  */
  70.  
  71. char    menu_title[] = "  Mini Pallete  ";
  72. char    wind_title[] = " Mini Pallete ";
  73.  
  74. /**************************************************************************
  75.  *
  76.  * palttree - The color pallete dialog tree.
  77.  *
  78.  *  This is NOT the output from a resource editor (it was a long time ago,
  79.  *  but it's been pretty much re-done by hand).
  80.  *
  81.  *  About extended object types... 
  82.  *
  83.  *  The ob_type field is a word, but the AES only uses the lower byte of 
  84.  *  it.  It has become a sort of standard technique for programs to use
  85.  *  the upper byte for their own evil purposes.  (Really, the object 
  86.  *  structure should have had an 'ob_apspec' longword in it for the 
  87.  *  application's use).  Anyway, there is some discussion under the 
  88.  *  'find_boxchar' routine below on accessing arrays of objects in a tree
  89.  *  without being sure where the objects are in the tree array.  The
  90.  *  methods discussed below work fine for boxchar objects; the extended
  91.  *  object type can be used for other types of objects.  
  92.  *
  93.  *  For example, suppose you have 10 strings in a dialog box.  You want to
  94.  *  set the ob_spec pointers at runtime to correspond to the elements in
  95.  *  an array of strings you've defined in your program.  You can code a
  96.  *  lot of C statements using the hard-coded object names, but what if you
  97.  *  have 50 strings instead of 10?  More to the point, what if some hacker
  98.  *  edits the .RSC file and changes the order of the objects? Bombs, that's
  99.  *  what.  So, you can (with most resource editors) set the extended 
  100.  *  object type for the strings to the numbers 1-10, then at runtime you
  101.  *  can scan the tree looking for an object with an extended type of 1,
  102.  *  then set the first string pointer, then scan for 2, and so on.  Now,
  103.  *  no matter where those strings get moved to in the tree structure, they
  104.  *  will be found at runtime and pointers will be assigned properly.
  105.  *
  106.  *  Now that I've described this nifty string-thing, I should mention that
  107.  *  this program doesn't use that techique, as it contains no strings in
  108.  *  the dialog. 
  109.  * 
  110.  *  This program uses the extended object type to hold the TOS color index
  111.  *  value that corresponds to the colored box which is the object.  This
  112.  *  is due to the screwy way the ST maps TOS colors to VDI colors.  If you
  113.  *  compare the VDI/object color number in the ob_spec field to the extended
  114.  *  object type value, you'll see the translation table that maps TOS colors
  115.  *  to GEM colors.  For the ob_type values below which are not described
  116.  *  by name, the format is 0xcc14, where 'cc' is the TOS color number, and
  117.  *  '14' is a box type object.
  118.  *
  119.  *  The ob_spec field for box-like objects maps out as follows:
  120.  *   0xaabbcdef
  121.  *     |||||||+-- inside fill color
  122.  *     ||||||+--- fill pattern and opaque/transparent flag
  123.  *     |||||+---- text color
  124.  *     ||||+----- border color
  125.  *     ||++------ border thickness (neg = outside width, pos = inside width)
  126.  *     ++-------- ASCII character for boxchar objects, zero for other types
  127.  *
  128.  *  The two objects flagged as HIDETREE are no longer used, and I don't
  129.  *  want to rebuild the whole tree to remove them (and I've lost the
  130.  *  .RSC file that this source comes from).
  131.  *************************************************************************/
  132.  
  133. OBJECT  palttree[] = {
  134.  
  135. /*          type       flags   state   ob_spec     x       y       w        h   */
  136.  
  137. -1,  1, 35, G_BOX,     NONE,     0, 0x00000000L, 0x0000, 0x0000, 0x0212, 0x0506,
  138.  
  139.  2, -1, -1, G_BOXCHAR, HIDETREE, 0, 0x05FF1100L, 0x0000, 0x0000, 0x0000, 0x0000,
  140.  3, -1, -1, G_BOX,     HIDETREE, 0, 0x00FF1121L, 0x0000, 0x0000, 0x0000, 0x0000,
  141.  
  142.  7,  4,  6, G_IBOX,    NONE,     0, 0x00001101L, 0x0100, 0x0100, 0x0401, 0x0703,
  143.  5, -1, -1, G_BOXCHAR, NONE,     0, 0x52001100L, 0x0200, 0x0100, 0x0001, 0x0001,
  144.  6, -1, -1, G_BOXCHAR, NONE,     0, 0x47001100L, 0x0200, 0x0401, 0x0001, 0x0001,
  145.  3, -1, -1, G_BOXCHAR, NONE,     0, 0x42001100L, 0x0200, 0x0702, 0x0001, 0x0001,
  146.  
  147. 35,  8, 26, G_IBOX,    NONE,     0, 0x00001100L, 0x0501, 0x0200, 0x0210, 0x0603,
  148.  
  149. 17,  9, 16, G_IBOX,    NONE,     0, 0x00001100L, 0x0100, 0x0000, 0x0010, 0x0001,
  150. 10, -1, -1, G_BOXCHAR, NONE,     0, 0x30FF1100L,  0, 0, 2, 1,
  151. 11, -1, -1, G_BOXCHAR, NONE,     0, 0x31FF1100L,  2, 0, 2, 1,
  152. 12, -1, -1, G_BOXCHAR, NONE,     0, 0x32FF1100L,  4, 0, 2, 1,
  153. 13, -1, -1, G_BOXCHAR, NONE,     0, 0x33FF1100L,  6, 0, 2, 1,
  154. 14, -1, -1, G_BOXCHAR, NONE,     0, 0x34FF1100L,  8, 0, 2, 1,
  155. 15, -1, -1, G_BOXCHAR, NONE,     0, 0x35FF1100L, 10, 0, 2, 1,
  156. 16, -1, -1, G_BOXCHAR, NONE,     0, 0x36FF1100L, 12, 0, 2, 1,
  157.  8, -1, -1, G_BOXCHAR, NONE,     0, 0x37FF1100L, 14, 0, 2, 1,
  158.  
  159. 26, 18, 25, G_IBOX,    NONE,     0, 0x00001100L, 0x0100, 0x0301, 0x0010, 0x0001,
  160. 19, -1, -1, G_BOXCHAR, NONE,     0, 0x30FF1100L,  0, 0, 2, 1,
  161. 20, -1, -1, G_BOXCHAR, NONE,     0, 0x31FF1100L,  2, 0, 2, 1,
  162. 21, -1, -1, G_BOXCHAR, NONE,     0, 0x32FF1100L,  4, 0, 2, 1,
  163. 22, -1, -1, G_BOXCHAR, NONE,     0, 0x33FF1100L,  6, 0, 2, 1,
  164. 23, -1, -1, G_BOXCHAR, NONE,     0, 0x34FF1100L,  8, 0, 2, 1,
  165. 24, -1, -1, G_BOXCHAR, NONE,     0, 0x35FF1100L, 10, 0, 2, 1,
  166. 25, -1, -1, G_BOXCHAR, NONE,     0, 0x36FF1100L, 12, 0, 2, 1,
  167. 17, -1, -1, G_BOXCHAR, NONE,     0, 0x37FF1100L, 14, 0, 2, 1,
  168.  
  169.  7, 27